Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
typescript如何生成对象';s type当前值的类型?_Typescript - Fatal编程技术网

typescript如何生成对象';s type当前值的类型?

typescript如何生成对象';s type当前值的类型?,typescript,Typescript,然后,obj的类型为: const obj = { a: 1, b: '2' } 但有时,我希望它的类型是: { a: number, b: string } 除以下各项外: { a: 1, b: '2' } 还有其他好方法吗?如果要强制执行一个类型,该类型的属性a的值始终为1,或者更一般地说,强制执行某些属性的保证常量值,请使其满足类似以下的接口: const obj: { a: 1, b: '2' } = { a: 1, b: '2' } 请记住,这仅适用于属性上的基元值,或包含其他

然后,
obj
的类型为:

const obj = { a: 1, b: '2' }
但有时,我希望它的类型是:

{ a: number, b: string }
除以下各项外:

{ a: 1, b: '2' }

还有其他好方法吗?

如果要强制执行一个类型,该类型的属性
a
的值始终为
1
,或者更一般地说,强制执行某些属性的保证常量值,请使其满足类似以下的接口:

const obj: { a: 1, b: '2' } = { a: 1, b: '2' }

请记住,这仅适用于属性上的基元值,或包含其他文字值的对象或数组文字。如果值仅以变量形式引用,则类型推断在此可能受到限制。Typescript不能总是推断命名对象的值。在这种情况下,这些类型签名主要用作断言,向下游代码保证值应被视为
红圈

如果在推断常量类型时要保留文本类型,可以使用
作为常量
断言:

interface RedCircle extends Shape {
  type: "circle";
  color: "red";
}
这也将使对象成为只读对象,但对于常量来说,这可能是正常的

如果您不希望属性为
readonly
,有几个选项,但没有一个是无缝的

一种选择是在文本上使用
作为常量


const obj = { a: 1, b: '2' } as const
// Same as
// const obj: {
//     readonly a: 1;
//     readonly b: "2";
// }
或者先声明
只读版本,然后使其可变:


const obj = { a: 1 as const, b: '2' as const } 
// Same as
// const obj: {
//     a: 1;
//     b: "2";
// }

类型Mutable={-readonly[P in keyof T]:T[P]}
常量ro_obj={a:1,b:'2'}作为常量
常量对象:可变=ro_对象
//常量对象:{
//a:1;
//b:“2”;
// }
或者我个人的最爱使用函数来推断字符串文字类型:


type Mutable<T> = { -readonly [P in keyof T]: T[P]}
const ro_obj = { a: 1 , b: '2' } as const
const obj: Mutable<typeof ro_obj> = ro_obj
// const obj: {
//     a: 1;
//     b: "2";
// }
函数作为文本(o:T){
返回o;
}
常量obj=asLiterals({a:1,b:'2'});
//同
//常量对象:{
//a:数字;
//b:弦;
// }

无法将值指定为类型,因此无法执行此操作。使用指定为当前值的类型,您试图实现什么?也许还有另一种方法,这里的常数只是一个例子。那么,它是否可以不是只读的?
function asLiterals<T extends Record<string, string | number | null | undefined | boolean >>(o: T) {
  return o;
}
const obj = asLiterals({ a: 1 , b: '2' });
// Same as 
// const obj: {
//     a: number;
//     b: string;
// }