const可以实现一个接口吗?



如何强制使用const类型并获得正确的值

。艾凡:"# 000000";不是字符串

我有这个接口和这个类型

interface IColor {
base: string
lighten1?: string
lighten2?: string
lighten3?: string
darken1?: string
darken2?: string
darken3?: string
}
type Color = IColor | string

我想要达到的目标:

export const DARK: Color = {
base: '#000000',
lighten1: '#212121',
someRandomProp: '#FFF' -> throws a error
}
const test = DARK.base -> shows '#00000' instead of string

当您为常量指定类型时,必须只指定该类型中的属性,除非它们位于非区分联合的其他部分,但这通常不重要。然而,TypeScript是duck类型的,因此你仍然可以使用as const使你的字符串字面量类型像你期望的那样为DARK对象工作,并删除类型注释。然后,创建一个显式声明类型为IColor的新常量,并将其赋值给DARK。这将断言DARK可分配给IColor,但当指定了额外的属性时,您将不会得到错误。

interface IColor {
base: string
lighten1?: string
lighten2?: string
lighten3?: string
darken1?: string
darken2?: string
darken3?: string
}
type Color = IColor | string
export const DARK = {
base: '#000000',
lighten1: '#212121',
someRandomProp: '#FFF',
} as const;
// { readonly base: "#000000"; readonly lighten1: "#212121"; readonly someRandomProp: "#FFF"; }

const _expectDARKIsColor: Color = DARK; // correctly passes
// FAILING EXAMPLE - no base
export const DARK2 = {
// base: '#000000',
lighten1: '#212121',
someRandomProp: '#FFF',
} as const;
const _expectDARK2IsColor: Color = DARK2; // correctly fails

TypeScript Playground Link

最新更新