代码:
interface Dog {
name?: string;
size?: number;
}
const entity: Dog = {
name: 'max',
}
const name: string = entity.name;
导致此错误:
我可以通过删除类型'string | undefined'不能赋值给类型'string'。
entity
类型来避免错误:
interface Dog {
name?: string;
size?: number;
}
const entity = {
name: 'max',
}
const name: string = entity.name;
但是我失去了自动完成功能。
有一种方法可以同时赢得两者吗?要有自动完成,并让代码知道哪些键是基于初始化?
。使用Required<Dog>
不是一个好的解决方案,因为我不想初始化size
。我的实际用例实际上有一个更大的界面。
Typescript>= 4.9
在typescript 4.9中,可以使用满足运算符:interface Dog {
name?: string;
size?: number;
}
const myDog = {
name: 'bello',
} satisfies Dog;
const dogName: string = myDog.name;
<标题>打印稿& lt;4.9我所做的是定义一个通用的身份检查函数,可以用于任何接口:
function identityCheck<T = never>() {
return <I>(input: I & T) => input as I;
}
然后为Dog
接口创建一个具体的检查函数:
const dogIdentity = identityCheck<Dog>();
最后用它来创建常量:
const myDog = dogIdentity({
name: 'bello',
})
// name is of type string
myDog.name.slice();
Typescript Playground示例
标题>您可以借助额外的函数来推断:
interface Dog {
name?: string;
size?: number;
}
type IsValidDog<Animal> = Required<Dog> extends Animal ? Animal : never;
const builder = <Animal extends Dog>(animal: IsValidDog<Animal>) => animal
/**
* Ok
*/
const result = builder({
name: 'max',
})
result.name // ok
result.size // expected error
const result2 = builder({
name: 'max',
size: 42
})
result2.name // ok
result2.size // ok
/**
* Error
*/
const result3 = builder({ name: 'Sharky', unknown: 2 }) // expected error
const result4 = builder({ nAme: 'Sharky', size: 2 }) // expected error
const result5 = builder({ name: 'Sharky', size: 2, surname: 'Doe' }) // expected error
游乐场
builder
函数期望/允许一个Dog
对象。它允许使用更少的属性,因为它们都是可选的,但它禁止使用任何额外的属性,参见result5
。
IsValidDog
-检查Dog
是否与所有必需的道具扩展了传递的对象接口。如果传递的对象带有一些额外的属性,则此检查将失败。
您可以在我的博客
中找到更多验证技术