13 typescript tsc
在TypeScript中,是否有一种类型的truthy?
我有这个方法:Object.keys(lck.lockholders).length; enqueue(k:any,obj?:any):void想想TS有一种方法来检查空字符串'',顺便说一下.我想将其转换为:
enqueue(k: Truthy, obj?: any): void
Run Code Online (Sandbox Code Playgroud)
除了我不知道如何定义Truthy的类型.我认为TS有一种方法可以检查空字符串''.
我想这样做的原因是因为我不希望用户通过在null
,undefined
,''
,等为重点,以哈希.
jca*_*alz 13
我不确定你为什么需要这个,但它很有趣.简而言之,简单的答案是:TypeScript不适合这样做,你可能最好做运行时检查和记录你的代码,以便开发人员知道k
param应该是真的.尽管如此,如果您试图强制TypeScript执行此类操作,请继续阅读:
注意:要使以下工作正常,请打开strictNullChecks
编译器选项.这是一种必要的,因为暂时无法辨别Truthy
从Truthy | null | undefined
将是一个问题.
你几乎可以定义falsy,就像
type Falsy = false | 0 | "" | null | undefined
Run Code Online (Sandbox Code Playgroud)
除了NaN
也是假的,TypeScript 没有数字文字NaN
.
即使你有Falsy
如上所述,TypeScript中也没有否定类型,所以没有办法表达Truthy
为"除了之外的一切Falsy
".
您可以尝试使用条件类型来排除可能的伪造参数enqueue()
,但这很奇怪:
type DefinitelyTruthy<T> =
false extends T ? never :
0 extends T ? never :
"" extends T ? never :
null extends T ? never :
undefined extends T ? never :
T
declare function enqueue<T extends number | string | true | object>(
k: T & DefinitelyTruthy<T>,
obj?: any
): void
declare const str: string;
enqueue(str); // error, might be falsy
enqueue("a"); // okay
enqueue(1); // okay
enqueue(0); // error
enqueue(NaN); // error
enqueue(true); // okay
enqueue(false); // error
enqueue([]); //okay
enqueue({a: "hello"}); // okay
enqueue({}); // error, interpreted as type {} which could be an empty string:
const zilch = "" as {};
enqueue(zilch); // error, see?
Run Code Online (Sandbox Code Playgroud)
注意它不会允许任何它认为可能是假的东西,这可能是你想要实现的.说不出来.
我看到你编辑了这个问题,以澄清k
参数应该是一个string
(或可能是a symbol
),并且你需要排除的唯一值是空字符串""
.在这种情况下,您可以将上述内容简化为:
type DefinitelyNotEmptyString<T> = "" extends T ? never : T
declare function enqueue<T extends string | symbol>(
k: T & DefinitelyNotEmptyString<T>,
obj?: any
): void
enqueue(""); // error
enqueue("a"); // okay
Run Code Online (Sandbox Code Playgroud)
所有这一切都很棒,但不幸的是,如果你将一个将军传递string
给enqueue()
它会失败,有时开发人员可能需要这样做,如果他们用于k
参数的值不是他们指定的字符串文字:
declare const str: string; // comes from somewhere else
enqueue(str); // error! how do I do this?
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,您可以尝试创建一个名义类型,您可以使用该类型向编译器标识已检查值是否为空,然后使用户定义的类型保护将a约束string
为该类型:
type NotEmptyString = string & {"***NotEmptyString***": true};
function notEmptyString(x: string): x is NotEmptyString {
return x !== "";
}
Run Code Online (Sandbox Code Playgroud)
现在开发人员可以这样做:
declare const str: string;
enqueue(str); // error, might be falsy
if (notEmptyString(str)) {
enqueue(str); // okay, str is NotEmptyString
}
Run Code Online (Sandbox Code Playgroud)
呼!这是很多箍跳.如果您认为这是值得的,那取决于您.好的,希望有所帮助.祝好运!
没有Truthy
类型,但是您可以利用类型保护系统(类型谓词)来帮助 TypeScript 了解真正是什么truthy
并为其分配truthy
类型!
让我们定义Falsy
类型和泛型 isTruthy
函数:
type Falsy = false | 0 | '' | null | undefined;
// this is a type predicate - if x is `truthy`, then it's T
const isTruthy = <T>(x: T | Falsy): x is T => !!x;
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用我们的isTruthy
函数来查找Truthy
值,TypeScript 将正确地将"truthy"
类型分配给结果。
例子:
{ // removing boolean "false" type
const result: string | false = Math.random() > 0.5 ? 'a' : false;
const truthyResult: string = isTruthy(result) ? result : 'was false';
}
{ // filtering only numbers from array
const result: (number | undefined)[] = [42, undefined, 8, 16];
const truthyResult: number[] = result.filter(isTruthy);
}
{ // filtering only Promises from array
const result: (Promise<string> | null)[] = [Promise.resolve('a'), null, Promise.resolve('b'), Promise.resolve('c')];
const truthyResult: Promise<string>[] = result.filter(isTruthy);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2266 次 |
最近记录: |