是否有一种方法可以使用带有可选键的typescript接口,但随后具体化键的存在?



代码:

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是否与所有必需的道具扩展了传递的对象接口。如果传递的对象带有一些额外的属性,则此检查将失败。

您可以在我的博客

中找到更多验证技术

相关内容

  • 没有找到相关文章

最新更新